home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac Interfaces / CIncludes / QD3DGroup.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  15.7 KB  |  507 lines  |  [TEXT/MPS ]

  1. /*
  2.      File:        QD3DGroup.h
  3.  
  4.      Contains:    Q3Group methods        
  5.  
  6.      Version:    Technology:    Quickdraw 3D 1.6
  7.                  Release:    QuickTime 4.0
  8.  
  9.      Copyright:    © 1995-1999 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:        For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __QD3DGROUP__
  18. #define __QD3DGROUP__
  19.  
  20. #ifndef __QD3D__
  21. #include <QD3D.h>
  22. #endif
  23.  
  24.  
  25.  
  26. #if PRAGMA_ONCE
  27. #pragma once
  28. #endif
  29.  
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33.  
  34. #if PRAGMA_IMPORT
  35. #pragma import on
  36. #endif
  37.  
  38. #if PRAGMA_STRUCT_ALIGN
  39.     #pragma options align=power
  40. #elif PRAGMA_STRUCT_PACKPUSH
  41.     #pragma pack(push, 2)
  42. #elif PRAGMA_STRUCT_PACK
  43.     #pragma pack(2)
  44. #endif
  45.  
  46. #if PRAGMA_ENUM_ALWAYSINT
  47.     #pragma enumsalwaysint on
  48. #elif PRAGMA_ENUM_OPTIONS
  49.     #pragma option enum=int
  50. #elif PRAGMA_ENUM_PACK
  51.     #if __option(pack_enums)
  52.         #define PRAGMA_ENUM_PACK__QD3DGROUP__
  53.     #endif
  54.     #pragma options(!pack_enums)
  55. #endif
  56.  
  57. /******************************************************************************
  58.  **                                                                             **
  59.  **                            Group Typedefs                                     **
  60.  **                                                                             **
  61.  *****************************************************************************/
  62. /*
  63.  * These flags affect how a group is traversed
  64.  * They apply to when a group is "drawn", "picked", "bounded", "written"
  65.  */
  66.  
  67. enum TQ3DisplayGroupStateMasks {
  68.     kQ3DisplayGroupStateNone    = 0,
  69.     kQ3DisplayGroupStateMaskIsDrawn = 1 << 0,
  70.     kQ3DisplayGroupStateMaskIsInline = 1 << 1,
  71.     kQ3DisplayGroupStateMaskUseBoundingBox = 1 << 2,
  72.     kQ3DisplayGroupStateMaskUseBoundingSphere = 1 << 3,
  73.     kQ3DisplayGroupStateMaskIsPicked = 1 << 4,
  74.     kQ3DisplayGroupStateMaskIsWritten = 1 << 5
  75. };
  76. typedef enum TQ3DisplayGroupStateMasks TQ3DisplayGroupStateMasks;
  77.  
  78. typedef unsigned long                     TQ3DisplayGroupState;
  79.  
  80.  
  81. /******************************************************************************
  82.  **                                                                             **
  83.  **                    Group Routines (apply to all groups)                     **
  84.  **                                                                             **
  85.  *****************************************************************************/
  86. /* May contain any shared object */
  87. EXTERN_API_C( TQ3GroupObject )
  88. Q3Group_New                        (void);
  89.  
  90. EXTERN_API_C( TQ3ObjectType )
  91. Q3Group_GetType                    (TQ3GroupObject         group);
  92.  
  93. EXTERN_API_C( TQ3GroupPosition )
  94. Q3Group_AddObject                (TQ3GroupObject         group,
  95.                                  TQ3Object                 object);
  96.  
  97. EXTERN_API_C( TQ3GroupPosition )
  98. Q3Group_AddObjectBefore            (TQ3GroupObject         group,
  99.                                  TQ3GroupPosition         position,
  100.                                  TQ3Object                 object);
  101.  
  102. EXTERN_API_C( TQ3GroupPosition )
  103. Q3Group_AddObjectAfter            (TQ3GroupObject         group,
  104.                                  TQ3GroupPosition         position,
  105.                                  TQ3Object                 object);
  106.  
  107. EXTERN_API_C( TQ3Status )
  108. Q3Group_GetPositionObject        (TQ3GroupObject         group,
  109.                                  TQ3GroupPosition         position,
  110.                                  TQ3Object *            object);
  111.  
  112. EXTERN_API_C( TQ3Status )
  113. Q3Group_SetPositionObject        (TQ3GroupObject         group,
  114.                                  TQ3GroupPosition         position,
  115.                                  TQ3Object                 object);
  116.  
  117. EXTERN_API_C( TQ3Object )
  118. Q3Group_RemovePosition            (TQ3GroupObject         group,
  119.                                  TQ3GroupPosition         position);
  120.  
  121. EXTERN_API_C( TQ3Status )
  122. Q3Group_GetFirstPosition        (TQ3GroupObject         group,
  123.                                  TQ3GroupPosition *        position);
  124.  
  125. EXTERN_API_C( TQ3Status )
  126. Q3Group_GetLastPosition            (TQ3GroupObject         group,
  127.                                  TQ3GroupPosition *        position);
  128.  
  129. EXTERN_API_C( TQ3Status )
  130. Q3Group_GetNextPosition            (TQ3GroupObject         group,
  131.                                  TQ3GroupPosition *        position);
  132.  
  133. EXTERN_API_C( TQ3Status )
  134. Q3Group_GetPreviousPosition        (TQ3GroupObject         group,
  135.                                  TQ3GroupPosition *        position);
  136.  
  137. EXTERN_API_C( TQ3Status )
  138. Q3Group_CountObjects            (TQ3GroupObject         group,
  139.                                  unsigned long *        nObjects);
  140.  
  141. EXTERN_API_C( TQ3Status )
  142. Q3Group_EmptyObjects            (TQ3GroupObject         group);
  143.  
  144. /*
  145.  *     Typed Access
  146.  */
  147. EXTERN_API_C( TQ3Status )
  148. Q3Group_GetFirstPositionOfType    (TQ3GroupObject         group,
  149.                                  TQ3ObjectType             isType,
  150.                                  TQ3GroupPosition *        position);
  151.  
  152. EXTERN_API_C( TQ3Status )
  153. Q3Group_GetLastPositionOfType    (TQ3GroupObject         group,
  154.                                  TQ3ObjectType             isType,
  155.                                  TQ3GroupPosition *        position);
  156.  
  157. EXTERN_API_C( TQ3Status )
  158. Q3Group_GetNextPositionOfType    (TQ3GroupObject         group,
  159.                                  TQ3ObjectType             isType,
  160.                                  TQ3GroupPosition *        position);
  161.  
  162. EXTERN_API_C( TQ3Status )
  163. Q3Group_GetPreviousPositionOfType (TQ3GroupObject         group,
  164.                                  TQ3ObjectType             isType,
  165.                                  TQ3GroupPosition *        position);
  166.  
  167. EXTERN_API_C( TQ3Status )
  168. Q3Group_CountObjectsOfType        (TQ3GroupObject         group,
  169.                                  TQ3ObjectType             isType,
  170.                                  unsigned long *        nObjects);
  171.  
  172. EXTERN_API_C( TQ3Status )
  173. Q3Group_EmptyObjectsOfType        (TQ3GroupObject         group,
  174.                                  TQ3ObjectType             isType);
  175.  
  176. /*
  177.  *    Determine position of objects in a group
  178.  */
  179. EXTERN_API_C( TQ3Status )
  180. Q3Group_GetFirstObjectPosition    (TQ3GroupObject         group,
  181.                                  TQ3Object                 object,
  182.                                  TQ3GroupPosition *        position);
  183.  
  184. EXTERN_API_C( TQ3Status )
  185. Q3Group_GetLastObjectPosition    (TQ3GroupObject         group,
  186.                                  TQ3Object                 object,
  187.                                  TQ3GroupPosition *        position);
  188.  
  189. EXTERN_API_C( TQ3Status )
  190. Q3Group_GetNextObjectPosition    (TQ3GroupObject         group,
  191.                                  TQ3Object                 object,
  192.                                  TQ3GroupPosition *        position);
  193.  
  194. EXTERN_API_C( TQ3Status )
  195. Q3Group_GetPreviousObjectPosition (TQ3GroupObject         group,
  196.                                  TQ3Object                 object,
  197.                                  TQ3GroupPosition *        position);
  198.  
  199.  
  200. /******************************************************************************
  201.  **                                                                             **
  202.  **                            Group Subclasses                                 **
  203.  **                                                                             **
  204.  *****************************************************************************/
  205. /* Must contain only lights */
  206. EXTERN_API_C( TQ3GroupObject )
  207. Q3LightGroup_New                (void);
  208.  
  209. /* Must contain only strings */
  210. EXTERN_API_C( TQ3GroupObject )
  211. Q3InfoGroup_New                    (void);
  212.  
  213. /******************************************************************************
  214.  **                                                                             **
  215.  **                        Display Group Routines                                 **
  216.  **                                                                             **
  217.  *****************************************************************************/
  218. /* May contain only drawables */
  219. EXTERN_API_C( TQ3GroupObject )
  220. Q3DisplayGroup_New                (void);
  221.  
  222. EXTERN_API_C( TQ3ObjectType )
  223. Q3DisplayGroup_GetType            (TQ3GroupObject         group);
  224.  
  225. EXTERN_API_C( TQ3Status )
  226. Q3DisplayGroup_GetState            (TQ3GroupObject         group,
  227.                                  TQ3DisplayGroupState *    state);
  228.  
  229. EXTERN_API_C( TQ3Status )
  230. Q3DisplayGroup_SetState            (TQ3GroupObject         group,
  231.                                  TQ3DisplayGroupState     state);
  232.  
  233. EXTERN_API_C( TQ3Status )
  234. Q3DisplayGroup_Submit            (TQ3GroupObject         group,
  235.                                  TQ3ViewObject             view);
  236.  
  237. EXTERN_API_C( TQ3Status )
  238. Q3DisplayGroup_SetAndUseBoundingBox (TQ3GroupObject     group,
  239.                                  TQ3BoundingBox *        bBox);
  240.  
  241. EXTERN_API_C( TQ3Status )
  242. Q3DisplayGroup_GetBoundingBox    (TQ3GroupObject         group,
  243.                                  TQ3BoundingBox *        bBox);
  244.  
  245. EXTERN_API_C( TQ3Status )
  246. Q3DisplayGroup_RemoveBoundingBox (TQ3GroupObject         group);
  247.  
  248. EXTERN_API_C( TQ3Status )
  249. Q3DisplayGroup_CalcAndUseBoundingBox (TQ3GroupObject     group,
  250.                                  TQ3ComputeBounds         computeBounds,
  251.                                  TQ3ViewObject             view);
  252.  
  253.  
  254. /******************************************************************************
  255.  **                                                                             **
  256.  **        Ordered Display Group                                                  **
  257.  **                                                                             **
  258.  **        Ordered display groups keep objects in order by the type of object:     **
  259.  **                                                                             **
  260.  **        1    kQ3ShapeTypeTransform                                             **
  261.  **        2    kQ3ShapeTypeStyle                                                  **
  262.  **        3    kQ3SetTypeAttribute                                                  **
  263.  **        4    kQ3ShapeTypeShader                                                  **
  264.  **        5    kQ3ShapeTypeCamera                                                  **
  265.  **        6    kQ3ShapeTypeLight                                                  **
  266.  **        7    kQ3ShapeTypeGeometry                                             **
  267.  **        8    kQ3ShapeTypeGroup                                                 **            
  268.  **        9    kQ3ShapeTypeUnknown                                                 **
  269.  **                                                                             **
  270.  **        Within a type, you are responsible for keeping things in order.         **
  271.  **                                                                             **
  272.  **        You may access and/or manipulate the group using the above types      **
  273.  **        (fast), or you may use any parent or leaf class types (slower).         **
  274.  **                                                                             **
  275.  **        Additional types will be added as functionality grows.                 **
  276.  **                                                                             **
  277.  **        The group calls which access by type are much faster for ordered     ** 
  278.  **        display group for the types above.                                     **
  279.  **                                                                             **
  280.  **        N.B. Lights and Cameras in groups are a no-op when drawn and will     **
  281.  **             post an error with the debug libraries.                         **
  282.  **                                                                             **
  283.  *****************************************************************************/
  284. EXTERN_API_C( TQ3GroupObject )
  285. Q3OrderedDisplayGroup_New        (void);
  286.  
  287. /******************************************************************************
  288.  **                                                                             **
  289.  **        IO Proxy Display Group                                                  **
  290.  **                                                                             **
  291.  **        IO Proxy display groups are used to place more than one              **
  292.  **        representation of an object in a metafile. For example, if you know     **
  293.  **        another program does not understand NURBPatches but does understand  **
  294.  **        Meshes, you may place a mesh and a NURB Patch in an IO Proxy Group,  **
  295.  **        and the reading program will select the desired representation.         **
  296.  **                                                                             **
  297.  **        Objects in an IO Proxy Display Group are placed in their preferencial**
  298.  **        order, with the FIRST object being the MOST preferred, the LAST      **
  299.  **        object the least preferred.                                             **
  300.  **                                                                             **
  301.  **        The behavior of an IO Proxy Display Group is that when drawn/picked/ **
  302.  **        bounded, the first object in the group that is not "Unknown" is used,**
  303.  **        and the other objects ignored.                                         **
  304.  **                                                                             **
  305.  *****************************************************************************/
  306. EXTERN_API_C( TQ3GroupObject )
  307. Q3IOProxyDisplayGroup_New        (void);
  308.  
  309. /******************************************************************************
  310.  **                                                                             **
  311.  **                        Group Extension Definitions                             **
  312.  **                                                                             **
  313.  *****************************************************************************/
  314. /*
  315.  *    Searching methods - OPTIONAL
  316.  */
  317. enum {
  318.     kQ3XMethodType_GroupAcceptObject = FOUR_CHAR_CODE('gaco')
  319. };
  320.  
  321. typedef CALLBACK_API_C( TQ3Boolean , TQ3XGroupAcceptObjectMethod )(TQ3GroupObject group, TQ3Object object);
  322. enum {
  323.     kQ3XMethodType_GroupAddObject = FOUR_CHAR_CODE('gado')
  324. };
  325.  
  326. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectMethod )(TQ3GroupObject group, TQ3Object object);
  327. enum {
  328.     kQ3XMethodType_GroupAddObjectBefore = FOUR_CHAR_CODE('gaob')
  329. };
  330.  
  331. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectBeforeMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  332. enum {
  333.     kQ3XMethodType_GroupAddObjectAfter = FOUR_CHAR_CODE('gaoa')
  334. };
  335.  
  336. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectAfterMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  337. enum {
  338.     kQ3XMethodType_GroupSetPositionObject = FOUR_CHAR_CODE('gspo')
  339. };
  340.  
  341. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupSetPositionObjectMethod )(TQ3GroupObject group, TQ3GroupPosition gPos, TQ3Object obj);
  342. enum {
  343.     kQ3XMethodType_GroupRemovePosition = FOUR_CHAR_CODE('grmp')
  344. };
  345.  
  346. typedef CALLBACK_API_C( TQ3Object , TQ3XGroupRemovePositionMethod )(TQ3GroupObject group, TQ3GroupPosition position);
  347.  
  348.  
  349. /*
  350.  *    Searching methods - OPTIONAL - default uses above methods
  351.  */
  352. enum {
  353.     kQ3XMethodType_GroupGetFirstPositionOfType = FOUR_CHAR_CODE('gfrt')
  354. };
  355.  
  356. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  357. enum {
  358.     kQ3XMethodType_GroupGetLastPositionOfType = FOUR_CHAR_CODE('glst')
  359. };
  360.  
  361. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  362. enum {
  363.     kQ3XMethodType_GroupGetNextPositionOfType = FOUR_CHAR_CODE('gnxt')
  364. };
  365.  
  366. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  367. enum {
  368.     kQ3XMethodType_GroupGetPrevPositionOfType = FOUR_CHAR_CODE('gpvt')
  369. };
  370.  
  371. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  372. enum {
  373.     kQ3XMethodType_GroupCountObjectsOfType = FOUR_CHAR_CODE('gcnt')
  374. };
  375.  
  376. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupCountObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, unsigned long *nObjects);
  377. enum {
  378.     kQ3XMethodType_GroupEmptyObjectsOfType = FOUR_CHAR_CODE('geot')
  379. };
  380.  
  381. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEmptyObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType);
  382. enum {
  383.     kQ3XMethodType_GroupGetFirstObjectPosition = FOUR_CHAR_CODE('gfop')
  384. };
  385.  
  386. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  387. enum {
  388.     kQ3XMethodType_GroupGetLastObjectPosition = FOUR_CHAR_CODE('glop')
  389. };
  390.  
  391. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  392. enum {
  393.     kQ3XMethodType_GroupGetNextObjectPosition = FOUR_CHAR_CODE('gnop')
  394. };
  395.  
  396. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  397. enum {
  398.     kQ3XMethodType_GroupGetPrevObjectPosition = FOUR_CHAR_CODE('gpop')
  399. };
  400.  
  401. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  402.  
  403.  
  404. /*
  405.  *    Group Position Methods
  406.  */
  407. enum {
  408.     kQ3XMethodType_GroupPositionSize = FOUR_CHAR_CODE('ggpz')
  409. };
  410.  
  411. typedef unsigned long                     TQ3XMethodTypeGroupPositionSize;
  412. enum {
  413.     kQ3XMethodType_GroupPositionNew = FOUR_CHAR_CODE('ggpn')
  414. };
  415.  
  416. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionNewMethod )(void *gPos, TQ3Object object, const void *initData);
  417. enum {
  418.     kQ3XMethodType_GroupPositionCopy = FOUR_CHAR_CODE('ggpc')
  419. };
  420.  
  421. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionCopyMethod )(void *srcGPos, void *dstGPos);
  422. enum {
  423.     kQ3XMethodType_GroupPositionDelete = FOUR_CHAR_CODE('ggpd')
  424. };
  425.  
  426. typedef CALLBACK_API_C( void , TQ3XGroupPositionDeleteMethod )(void *gPos);
  427.  
  428.  
  429. /*
  430.  *    View Drawing Helpers
  431.  *    
  432.  *    TQ3XGroupStartIterateMethod
  433.  *
  434.  *        Pass back *object = NULL to NOT call EndIterate iterate
  435.  *        Pass back *object != NULL to draw object
  436.  *         (other side will pass it to EndIterate for deletion!)
  437.  *
  438.  *        *iterator is uninitialized, use for iteration state. Caller should 
  439.  *         ignore it.
  440.  *    
  441.  *    TQ3XGroupEndIterateMethod
  442.  *    
  443.  *        *object is previous object, dispose it or play with it.
  444.  *        Pass back NULL when last iteration has occurred
  445.  *        *iterator is previous value, use for iteration state Caller should 
  446.  *        ignore it.
  447.  */
  448. enum {
  449.     kQ3XMethodType_GroupStartIterate = FOUR_CHAR_CODE('gstd')
  450. };
  451.  
  452. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupStartIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  453. enum {
  454.     kQ3XMethodType_GroupEndIterate = FOUR_CHAR_CODE('gitd')
  455. };
  456.  
  457. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  458.  
  459.  
  460. /*
  461.  *    IO  Helpers
  462.  *    
  463.  *    TQ3XGroupEndReadMethod
  464.  *        Called when a group has been completely read. Group should perform
  465.  *        validation and clean up any reading caches.
  466.  */
  467. enum {
  468.     kQ3XMethodType_GroupEndRead    = FOUR_CHAR_CODE('gerd')
  469. };
  470.  
  471. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndReadMethod )(TQ3GroupObject group);
  472. EXTERN_API_C( void *)
  473. Q3XGroup_GetPositionPrivate        (TQ3GroupObject         group,
  474.                                  TQ3GroupPosition         position);
  475.  
  476.  
  477.  
  478.  
  479. #if PRAGMA_ENUM_ALWAYSINT
  480.     #pragma enumsalwaysint reset
  481. #elif PRAGMA_ENUM_OPTIONS
  482.     #pragma option enum=reset
  483. #elif defined(PRAGMA_ENUM_PACK__QD3DGROUP__)
  484.     #pragma options(pack_enums)
  485. #endif
  486.  
  487. #if PRAGMA_STRUCT_ALIGN
  488.     #pragma options align=reset
  489. #elif PRAGMA_STRUCT_PACKPUSH
  490.     #pragma pack(pop)
  491. #elif PRAGMA_STRUCT_PACK
  492.     #pragma pack()
  493. #endif
  494.  
  495. #ifdef PRAGMA_IMPORT_OFF
  496. #pragma import off
  497. #elif PRAGMA_IMPORT
  498. #pragma import reset
  499. #endif
  500.  
  501. #ifdef __cplusplus
  502. }
  503. #endif
  504.  
  505. #endif /* __QD3DGROUP__ */
  506.  
  507.